package com.lk.sys.service.impl;

import com.lk.sys.common.annotation.ClearCache;
import com.lk.sys.common.annotation.RequiredCache;
import com.lk.sys.common.exception.ServiceException;
import com.lk.sys.common.vo.Node;
import com.lk.sys.dao.SysMenuDao;
import com.lk.sys.dao.SysRoleMenuDao;
import com.lk.sys.entity.SysMenu;
import com.lk.sys.service.SysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;

import java.util.List;
import java.util.Map;

@Service
public class SysMenuServiceImpl implements SysMenuService {
    @Autowired
    private SysMenuDao sysMenuDao;

    @Autowired
    private SysRoleMenuDao sysRoleMenuDao;

    /**
     * 菜单添加界面，数据库持久化
     * @author Lukang
     * @date 2021/11/11 下午9:18
     * @param entity
     * @return int
     */
    @Override
    public int insertObject(SysMenu entity) {
        if (entity == null)
            throw new IllegalArgumentException("无法添加空的内容");
        if (StringUtils.isEmpty(entity.getName()))
            throw new ServiceException("菜单名称不能空");
        int rows = sysMenuDao.insertObject(entity);
        return rows;
    }

    /**
     * 查询sys_menu中的id，parentId，name中的内容作为zTree中的节点内容
     * @author Lukang
     * @date 2021/11/8 下午9:06
     * @return java.util.List<com.lk.sys.common.vo.Node>
     */
    @Override
    public List<Node> findZtreeMenuNodes() {
        //这一般还会有其他操作，如增加缓存，redis之类的
        List<Node> ztreeMenuNodes = sysMenuDao.findZtreeMenuNodes();
        return ztreeMenuNodes;
    }

    /**
     * 查询所有菜单数据
     * @author Lukang
     * @date 2021/11/4 下午9:45
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     */
    @RequiredCache(key = "menuData")
    @Override
    public List<Map<String, Object>> findObjects() {
        return sysMenuDao.findObjects();
    }

    /**
     * 基于菜单id删除对应数据
     * @author Lukang
     * @date 2021/11/4 下午9:45
     * @param id
     * @return int
     */
    @ClearCache(key = "menuData")
    @Override
    public int deleteObject(Integer id) {
        //校验id数据123
        if (id == null || id < 1)
            throw new IllegalArgumentException("请先选择要删除的数据");
        //获取id对应的子菜单的数量
        int childCounts = sysMenuDao.getChildCount(id);
        if (childCounts > 0)
            throw new ServiceException("请先删除子菜单");
        //删除角色菜单关系数据
        int roleMenuRows = sysRoleMenuDao.deleteObjectRoleMenuId(id);
        //删除菜单数据
        int rows = sysMenuDao.deleteObject(id);
        if (rows == 0)
            throw new ServiceException("此数据可能已不存在");
        return rows;
    }
}
